unit fmXilinx ;

interface

uses
   Windows,
   Messages,
   SysUtils,
   Variants,
   Classes,
   Graphics,
   Controls,
   Forms,
   Dialogs,
   StdCtrls,
   SpTBXEditors,
   SpTBXControls,
   Grids ;

type
   TfrmXilinx = class( TFrame )
      SpTBXPanel1 : TSpTBXPanel ;
      SpTBXGroupBox1 : TSpTBXGroupBox ;
      beXilinx : TSpTBXButtonEdit ;
      procedure beXilinxSubEditButton0Click( Sender : TObject ) ;
   private
      { Private declarations }
      fXilinx : TStringlist ;
   public
      { Public declarations }
      constructor Create( AOwner : TComponent ) ; override ;
      destructor Destroy ; override ;
   end ;

implementation

{$R *.dfm}

uses
   Contnrs,
   sdXmlDocuments,
   uBasic,
   uObjects ;

procedure TfrmXilinx.beXilinxSubEditButton0Click( Sender : TObject ) ;
var
   i                : integer ;
   s, t             : TStringlist ;
   g                : TObjectlist ;
   x, iName         : string ;
   swap, ioindex    : integer ;
   xml              : TsdXmlDocument ;
   fNode, iPorts, iPort : TXMLNode ;
   iGUID            : TGUID ;
   iType            : TMedaPortType ;
   iDirection       : integer ;
begin
   fXilinx.LoadFromFile( beXilinx.Text ) ;
   g := TObjectlist.Create ;
   s := TStringlist.Create ;

   try
      for i := 0 to fXilinx.Count - 1 do begin
         t := TStringlist.Create ;
         t.CommaText := fXilinx[ i ] ;
         if t.Count = 11 then
            g.Add( t ) ;
      end ;

      xml := TsdXmlDocument.Create ;
      with xml do try
         fNode := Root ;
         fNode.Name := 'Library' ;

         fNode := fNode.NodeNew( 'Part' ) ;
         try
            fNode.AttributeAdd( 'name', TStringlist( g[ 0 ] )[ 5 ] ) ;
            iPorts := fNode.NodeNew( 'Ports' ) ;

            fNode := fNode.NodeNew( 'Banks' ) ;
            try
               fNode := fNode.NodeNew( 'Bank' ) ;
               try
                  fNode.AttributeAdd( 'name', 'IO' ) ;
                  ioindex := 0 ;
                  for i := 1 to g.Count - 1 do begin
                     if TStringlist( g[ i ] )[ 9 ] = 'VCCAUX' then
                     else if TStringlist( g[ i ] )[ 9 ] = 'VCCINT' then
                     else if TStringlist( g[ i ] )[ 9 ] = 'GND' then
                     else begin
                        iName := TStringlist( g[ i ] )[ 5 ] ;
                        swap := 0 ;
                        if 'IO' = iName then begin
                           iName := Format( '%s%d_%d', [ iName, ioindex, StrToIntDef( TStringlist( g[ i ] )[ 9 ], -1 ) ] ) ;
                           inc( ioindex ) ;
                        end
                        else if 'IP' = iName then begin
                           iName := Format( '%s%d_%d', [ iName, ioindex, StrToIntDef( TStringlist( g[ i ] )[ 9 ], -1 ) ] ) ;
                           inc( ioindex ) ;
                        end ;
                        if Pos( 'GCLK', iName ) > 0 then
                           iType := pntClock
                        else if Pos( 'IO', iName ) > 0 then
                           iType := pntIO
                        else if Pos( 'IP', iName ) > 0 then
                           iType := pntIn
                        else if Pos( 'VCC', iName ) > 0 then
                           iType := pntPower ;
                        iDirection := StrToIntDef( TStringlist( g[ i ] )[ 9 ], 0 ) * 2 ;
                        fNode := fNode.NodeNew( 'Pin' ) ;
                        try
                           iPort := iPorts.NodeNew( 'Port' ) ;
                           CreateGUID( iGUID ) ;
                           iPort.AttributeAdd( 'id', GUIDToString( iGUID ) ) ;
                           iPort.AttributeAdd( 'name', iName ) ;
                           iPort.AttributeAdd( 'ref', TStringlist( g[ i ] )[ 2 ] ) ;
                           iPort.AttributeAdd( 'type', ord( iType ) ) ;
                           fNode.AttributeAdd( 'port', GUIDToString( iGUID ) ) ;
                           fNode.AttributeAdd( 'direction', iDirection ) ;
                           fNode.AttributeAdd( 'flags', '0111' ) ;
                           fNode.AttributeAdd( 'size', 1 ) ;
                        finally
                           fNode := fNode.Parent ;
                        end ;
                     end ;
                  end ;
               finally
                  fNode := fNode.Parent ;
               end ;

               fNode := fNode.NodeNew( 'Bank' ) ;
               try
                  fNode.AttributeAdd( 'name', 'AUX' ) ;
                  ioindex := 0 ;
                  for i := 1 to g.Count - 1 do
                     if TStringlist( g[ i ] )[ 9 ] = 'VCCAUX' then begin
                        fNode := fNode.NodeNew( 'Pin' ) ;
                        try
                           iName := TStringlist( g[ i ] )[ 5 ] ;
                           swap := 0 ;
                           if 'VCCAUX' = iName then begin
                              iName := Format( '%s_%d', [ iName, ioindex ] ) ;
                              inc( ioindex ) ;
                              swap := 1 ;
                           end ;
                           iPort := iPorts.NodeNew( 'Port' ) ;
                           CreateGUID( iGUID ) ;
                           iPort.AttributeAdd( 'id', GUIDToString( iGUID ) ) ;
                           iPort.AttributeAdd( 'name', iName ) ;
                           iPort.AttributeAdd( 'ref', TStringlist( g[ i ] )[ 2 ] ) ;
                           iPort.AttributeAdd( 'type', ord( pntPower ) ) ;
                           fNode.AttributeAdd( 'port', GUIDToString( iGUID ) ) ;
                           fNode.AttributeAdd( 'flags', '0111' ) ;
                           fNode.AttributeAdd( 'size', 1 ) ;
                        finally
                           fNode := fNode.Parent ;
                        end ;
                     end ;
               finally
                  fNode := fNode.Parent ;
               end ;

               fNode := fNode.NodeNew( 'Bank' ) ;
               try
                  fNode.AttributeAdd( 'name', 'INT' ) ;
                  ioindex := 0 ;
                  for i := 1 to g.Count - 1 do
                     if TStringlist( g[ i ] )[ 9 ] = 'VCCINT' then begin
                        fNode := fNode.NodeNew( 'Pin' ) ;
                        try
                           iName := TStringlist( g[ i ] )[ 5 ] ;
                           if 'VCCINT' = iName then begin
                              iName := Format( '%s_%d', [ iName, ioindex ] ) ;
                              inc( ioindex ) ;
                              swap := 1 ;
                           end
                           else
                              swap := 0 ;
                           iPort := iPorts.NodeNew( 'Port' ) ;
                           CreateGUID( iGUID ) ;
                           iPort.AttributeAdd( 'id', GUIDToString( iGUID ) ) ;
                           iPort.AttributeAdd( 'name', iName ) ;
                           iPort.AttributeAdd( 'ref', TStringlist( g[ i ] )[ 2 ] ) ;
                           iPort.AttributeAdd( 'type', ord( pntPower ) ) ;
                           fNode.AttributeAdd( 'port', GUIDToString( iGUID ) ) ;
                           fNode.AttributeAdd( 'flags', '0111' ) ;
                           fNode.AttributeAdd( 'size', 1 ) ;
                        finally
                           fNode := fNode.Parent ;
                        end ;
                     end ;
               finally
                  fNode := fNode.Parent ;
               end ;

               fNode := fNode.NodeNew( 'Bank' ) ;
               try
                  fNode.AttributeAdd( 'name', 'GND' ) ;
                  ioindex := 0 ;
                  for i := 1 to g.Count - 1 do
                     if TStringlist( g[ i ] )[ 9 ] = 'GND' then begin
                        fNode := fNode.NodeNew( 'Pin' ) ;
                        try
                           iName := TStringlist( g[ i ] )[ 5 ] ;
                           if 'VCCINT' = iName then begin
                              iName := Format( '%s_%d', [ iName, ioindex ] ) ;
                              inc( ioindex ) ;
                              swap := 1 ;
                           end
                           else
                              swap := 0 ;
                           iPort := iPorts.NodeNew( 'Port' ) ;
                           CreateGUID( iGUID ) ;
                           iPort.AttributeAdd( 'id', GUIDToString( iGUID ) ) ;
                           iPort.AttributeAdd( 'name', iName ) ;
                           iPort.AttributeAdd( 'ref', TStringlist( g[ i ] )[ 2 ] ) ;
                           iPort.AttributeAdd( 'type', ord( pntGround ) ) ;
                           fNode.AttributeAdd( 'port', GUIDToString( iGUID ) ) ;
                           fNode.AttributeAdd( 'flags', '0111' ) ;
                           fNode.AttributeAdd( 'size', 1 ) ;
                        finally
                           fNode := fNode.Parent ;
                        end ;
                     end ;
               finally
                  fNode := fNode.Parent ;
               end ;
            finally
               fNode := fNode.Parent ;
            end ;
         finally
            fNode := fNode.Parent ;
         end ;

         xml.ExternalEncoding := se8bit ;
         xml.XmlFormat := xfReadable ;
         xml.CommentString := 'Created by ' + Application.Title ;
         xml.WriteOnDefault := False ;
         xml.SaveToFile( 'C:\Projects\ObjectEDA\pXilinx\tables\XC3S500E_FT256.xml' ) ;
      finally
         xml.Free ;
      end ;
   finally
      s.Free ;
      g.Free ;
   end ;
end ;

constructor TfrmXilinx.Create( AOwner : TComponent ) ;
begin
   inherited ;
   fXilinx := TStringlist.Create ;
end ;

destructor TfrmXilinx.Destroy ;
begin
   fXilinx.Free ;
   inherited ;
end ;

//procedure TfrmXilinx.beXilinxSubEditButton0Click( Sender : TObject ) ;
//var
//   i                : integer ;
//   s, t             : TStringlist ;
//   g                : TObjectlist ;
//   x, name          : string ;
//   swap, ioindex    : integer ;
//begin
//   fXilinx.LoadFromFile( beXilinx.Text ) ;
//   g := TObjectlist.Create ;
//   s := TStringlist.Create ;
//   t := nil ;
//   x := TsdXmlDocument.Create ;
//
//   with x do try
//      for i := 0 to fXilinx.Count - 1 do begin
//         t := TStringlist.Create ;
//         t.CommaText := fXilinx[ i ] ;
//         if t.Count = 11 then
//            g.Add( t ) ;
//      end ;
//
//      s.Clear ;
//      s.Add( '*PADS-LIBRARY-PART-TYPES-V4*' ) ;
//      s.Add( '' ) ;
//
//      t := TStringlist.Create ;
//      ioindex := 0 ;
//      for i := 1 to g.Count - 1 do
//         if TStringlist( g[ i ] )[ 9 ] = 'VCCAUX' then
//         else if TStringlist( g[ i ] )[ 9 ] = 'VCCINT' then
//         else if TStringlist( g[ i ] )[ 8 ] <> 'GND' then begin
//            name := TStringlist( g[ i ] )[ 5 ] ;
//            swap := 0 ;
//            if 'IO' = name then begin
//               name := Format( '%s%d_%d', [ name, ioindex, StrToIntDef( TStringlist( g[ i ] )[ 9 ], -1 ) ] ) ;
//               inc( ioindex ) ;
//            end
//            else if 'IP' = name then begin
//               name := Format( '%s%d_%d', [ name, ioindex, StrToIntDef( TStringlist( g[ i ] )[ 9 ], -1 ) ] ) ;
//               inc( ioindex ) ;
//            end ;
//            if Pos( 'IO', name ) > 0 then
//               swap := 1
//            else if Pos( 'IP', name ) > 0 then
//               swap := 2 ;
//            t.Add( Format( '%d.%d.U.%s', [ i, swap, name ] ) ) ;
//         end ;
//
//      s.Add( Format( 'G:%s 0 %d', [ 'XC3S500E_IO', t.count ] ) ) ;
//      s.AddStrings( t ) ;
//
//      t.Clear ;
//      ioindex := 0 ;
//      for i := 1 to g.Count - 1 do
//         if TStringlist( g[ i ] )[ 9 ] = 'VCCAUX' then begin
//            name := TStringlist( g[ i ] )[ 5 ] ;
//            swap := 0 ;
//            if 'VCCAUX' = name then begin
//               name := Format( '%s_%d', [ name, ioindex ] ) ;
//               inc( ioindex ) ;
//               swap := 1 ;
//            end ;
//            t.Add( Format( '%d.%d.U.%s', [ i, swap, name ] ) ) ;
//         end ;
//
//      s.Add( Format( 'G:%s 0 %d', [ 'XC3S500E_AUX', t.count ] ) ) ;
//      s.AddStrings( t ) ;
//
//      t.Clear ;
//      ioindex := 0 ;
//      for i := 1 to g.Count - 1 do
//         if TStringlist( g[ i ] )[ 9 ] = 'VCCINT' then begin
//            name := TStringlist( g[ i ] )[ 5 ] ;
//            if 'VCCINT' = name then begin
//               name := Format( '%s_%d', [ name, ioindex ] ) ;
//               inc( ioindex ) ;
//               swap := 1 ;
//            end
//            else
//               swap := 0 ;
//            t.Add( Format( '%d.%d.U.%s', [ i, swap, name ] ) ) ;
//         end ;
//
//      s.Add( Format( 'G:%s 0 %d', [ 'XC3S500E_INT', t.count ] ) ) ;
//      s.AddStrings( t ) ;
//
//      t.Clear ;
//      for i := 1 to g.Count - 1 do
//         if TStringlist( g[ i ] )[ 8 ] = 'GND' then
//            t.Add( Format( 'SIGPIN %d 50 %s', [ i, 'GND' ] ) ) ;
//      s.AddStrings( t ) ;
//      s.Insert( 2, Format( '%s %s I %s 0 3 %d %d 0 %d', [ 'XC3S500E_FT256', 'FT256', 'FPG', t.Count, 256, 256 ] ) ) ;
//
//      t.Clear ;
//      x := '' ;
//      for i := 1 to g.Count - 1 do begin
//         x := x + Format( '%s', [ TStringlist( g[ i ] )[ 2 ] ] ) + ' ' ;
//         if i mod 16 = 0 then begin
//            t.Add( x ) ;
//            x := '' ;
//         end ;
//      end ;
//      s.AddStrings( t ) ;
//
//      s.Add( '' ) ;
//      s.Add( '*END*' ) ;
//
//      s.SaveToFile( 'C:\Projects\ObjectEDA\pXilinx\tables\XC3S500E_FT256.p' ) ;
//   finally
//      if assigned( t ) then
//         t.Free ;
//      s.Free ;
//      g.Free ;
//   end ;
//end ;

end.

